#include "queue.h"
#include "sqstack.h"

#define NUM_OF_BOLL 27

static int check(queue *qu)
{
     int i = (qu->head + 1) % MAXSIZE;    //第一个值的起始位置(队头指向的位置不存放数据)
     while (i != qu->tail)
     {
          if (qu->data[i] > qu->data[(i + 1) % MAXSIZE])
               return 0;
          i = (i + 1) % MAXSIZE;
     }
     return 1;
}

int main(void)
{
     queue *qu = queue_create();
     sqstack *st_min = stack_create();
     sqstack *st_five_min = stack_create();
     sqstack *st_hour = stack_create();
     if (qu == NULL || st_min == NULL || st_five_min == NULL || st_hour == NULL)
          exit(1);

     for (int i = 1; i <= NUM_OF_BOLL; i++)
          queue_enqueue(qu, &i);

     int t, value;    
     int time = 0;                //记录分钟数
     while (1)
     {
          queue_dequeue(qu, &t); //出队
          time++;
          if (st_min->top != 3)
               stack_push(st_min, &t);   //一分钟栈未满，小球入栈
          else               //一分钟栈满了
          {
               while (!stack_isempty(st_min)) //1分钟栈非空,循环4次清空栈
               {
                    stack_pop(st_min, &value);
                    queue_enqueue(qu, &value);       //出栈入队
               }
               if (st_five_min->top != 10)     //5分钟栈未满，小球入栈
                    stack_push(st_five_min, &t);
               else                                   //5分钟栈满了
               {
                    while (!stack_isempty(st_five_min))   //5分钟栈非空，循环11次清空栈
                    {
                         stack_pop(st_five_min, &value);
                         queue_enqueue(qu, &value);         //出栈入队
                    }
                    if (st_hour->top != 10)            //小时栈没满
                         stack_push(st_hour, &t);
                    else                            //小时栈也满了
                    {
                         while (!stack_isempty(st_hour))      //小时栈非空,循环11次清空栈
                         {
                              stack_pop(st_hour, &value);
                              queue_enqueue(qu, &value);
                         }
                         queue_enqueue(qu, &t);     //t值入队,检查队列是否按序
                         if (check(qu))
                              break;
                    }
               }
          }
     }

     printf("time = %d\n", time);

     queue_destory(&qu);
     stack_destory(&st_min);
     stack_destory(&st_five_min);
     stack_destory(&st_hour);

     return 0;
}
